package com.pig.sentinel.context;

import com.pig.sentinel.SentinalConst;

import java.util.concurrent.atomic.AtomicLong;

public class DegradeContext {
    /**
     * 异常次数
     */
    private AtomicLong exceptionTimes = new AtomicLong(0);
    /**
     * 窗口期开始时间
     */
    private volatile long windowStartTime;

    private volatile boolean isWindowTime;

    /**
     * 是否是窗口时间
     */
    public boolean isWindowTime() {
        return isWindowTime;
    }
    /**
     * 是否已经过了是窗口时间
     */
    public boolean isOverWindowTime() {
        long now = System.currentTimeMillis();
        if (now > (windowStartTime + SentinalConst.WINDOW_TIME)) {
            return true;
        }
        return false;
    }
    /**
     * 重置窗口期开始时间
     */
    public void restWindowStartTime() {
        if (isWindowTime && isOverWindowTime()) {
            windowStartTime = 0;
            exceptionTimes.set(0);
            isWindowTime = false;
        }
    }

    /**
     * 重置异常次数，比如定义的连续5次异常后降级，在连续4次异常后，如果第5次正常，则重置此值
     */
    public void restExceptionTimes() {
        exceptionTimes.set(0);
    }

    public void incExceptionTimes() {
        long times = exceptionTimes.incrementAndGet();
        if (times >= SentinalConst.EXCEPTION_TIMES) {
            this.windowStartTime = System.currentTimeMillis();
            isWindowTime = true;
        }
    }
}
